package chemtools_logica.BDL.SFBean;

import chemtools_logica.BDL.IL.BDL_SFTipoinsumoLocal;
import chemtools_logica.BDL.IR.BDL_SFTipoinsumoRemote;


import chemtools_logica.Entidades.Graficoempresas;
import chemtools_logica.Entidades.Graficoestado;
import chemtools_logica.Entidades.Graficotipoinsumo;
import chemtools_logica.Entidades.Medida;
import chemtools_logica.Entidades.Tipoinsumo;

import chemtools_logica.util_formato.Fecha.FechaUtiles;

import java.sql.CallableStatement;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.annotation.Resource;

import javax.ejb.SessionContext;
import javax.ejb.Stateless;

import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.persistence.StoredProcedureQuery;

import javax.sql.DataSource;

import org.eclipse.persistence.jpa.JpaEntityManager;
import org.eclipse.persistence.queries.DataReadQuery;
import org.eclipse.persistence.queries.StoredProcedureCall;
import org.eclipse.persistence.sessions.Session;

@Stateless(name = "BDL_SFTipoinsumo", mappedName = "map-BDL_SFTipoinsumo")
public class BDL_SFTipoinsumoBean implements BDL_SFTipoinsumoRemote, BDL_SFTipoinsumoLocal {
    @Resource
    SessionContext sessionContext;
    @PersistenceContext(unitName = "Chemtools_Logica")
    private EntityManager em;

    public BDL_SFTipoinsumoBean() {
    }

    public Tipoinsumo persistTipoinsumo(Tipoinsumo tipoinsumo) {
        em.persist(tipoinsumo);
        return tipoinsumo;
    }

    public Tipoinsumo mergeTipoinsumo(Tipoinsumo tipoinsumo) {
        return em.merge(tipoinsumo);
    }

    public void removeTipoinsumo(Tipoinsumo tipoinsumo) {
        tipoinsumo = em.find(Tipoinsumo.class, tipoinsumo.getIdTipoInsumo());
        em.remove(tipoinsumo);
    }

    /** <code>select o from Tipoinsumo o</code> */
    @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
    public List<Tipoinsumo> getTipoinsumoFindAll() {
        return em.createNamedQuery("Tipoinsumo.findAll", Tipoinsumo.class).getResultList();
    }
    
    public List<Tipoinsumo> getTipoinsumosActivos(){
        List<Tipoinsumo> tipoInsumos = new ArrayList<Tipoinsumo>();
        
        String ejbQuery = "SELECT u FROM Tipoinsumo u " +
                          "WHERE u.estado = 1 ";
        
        try{
            Query query = em.createQuery(ejbQuery);
            tipoInsumos = query.getResultList();
        }catch(Exception e)
        {
            tipoInsumos = null;
        }

        return tipoInsumos;
    }
    public List<Tipoinsumo> getTipoinsumosNoSeleccionados(int idFormula){
            String ejbQuery = "SELECT u FROM Tipoinsumo u " +
                              "WHERE u.estado = 1 " +
                              "and u.idTipoInsumo " +
                              "not in(Select d.tipoinsumo.idTipoInsumo from Detalleformula d where d.formula.idFormula = " + idFormula +")";
            
        return em.createQuery(ejbQuery, Tipoinsumo.class).getResultList();
        }
    
    public List<Graficotipoinsumo> getCharTipoInsumo(String idAlmacen, Date fechaMin, Date fechaMax){
        List<Graficotipoinsumo> grafico = new ArrayList<Graficotipoinsumo>();
        String ejbQuery = "{CALL graficoTipoInsumo(?,?,?)}";
             Query query = em.createNativeQuery(ejbQuery, Graficotipoinsumo.class);
             query.setParameter(1, idAlmacen);
             query.setParameter(2, fechaMin);
             query.setParameter(3, fechaMax);
             grafico = query.getResultList();

        return grafico;
    }
    
    public List<Graficoempresas> getChartTInsumoEmpresas(Date fechaMin, Date fechaMax){
        List<Graficoempresas> grafico = new ArrayList<Graficoempresas>();
        String ejbQuery = "{CALL graficoEmpresasInsumo(?,?)}";
             Query query = em.createNativeQuery(ejbQuery, Graficoempresas.class);
             query.setParameter(1, fechaMin);
             query.setParameter(2, fechaMax);
             grafico = query.getResultList();

        return grafico;
    }
    
    public List<Graficoestado> getChartEstado(String idAlmacen, Date fechaMin, Date fechaMax){
        List<Graficoestado> grafico = new ArrayList<Graficoestado>();
        String ejbQuery = "{CALL graficoInsumoEstado(?,?,?)}";
             Query query = em.createNativeQuery(ejbQuery, Graficoestado.class);
             query.setParameter(1, idAlmacen);
             query.setParameter(2, fechaMin);
             query.setParameter(3, fechaMax);
             grafico = query.getResultList();

        return grafico;
    }
    
    public List<Tipoinsumo> getTipoInsumosChart1(String empresaNombre){
        List<Tipoinsumo> tipoInsumos = new ArrayList<Tipoinsumo>();
        
        String ejbQuery = "SELECT ti.* " +
                            "FROM tipoinsumo ti, insumo i, empresa e,medida m, contenedores c " + 
                            "WHERE ti.idTipoInsumo = i.idTipoInsumo " + 
                            "AND i.idEmpresa       = e.idEmpresa " +
                            "AND ti.idMedida       = m.idMedida " +
                            "AND ti.idContenedores = c.idContenedores " + 
                            "AND e.RAZON_SOCIAL    = '"+empresaNombre+"'";
        
        try{
            Query query = em.createNativeQuery(ejbQuery,Tipoinsumo.class);
            tipoInsumos = query.getResultList();
        }catch(Exception e)
        {
            tipoInsumos = null;
        }

        return tipoInsumos;
    }
    
    public Tipoinsumo getDetalleTInsumo(String idTipoInsumo){
        Tipoinsumo entidad = new Tipoinsumo();
        String ejbQuery = "SELECT ti.* " +
                        "FROM tipoinsumo ti " +
                        "INNER JOIN medida m " +
                        "ON ti.idMedida = m.idMedida " +
                        "INNER JOIN contenedores c " +
                        "ON ti.idContenedores = c.idContenedores " +
                        "WHERE ti.idTipoInsumo = "+idTipoInsumo;
        try{
            Query query = em.createNativeQuery(ejbQuery,Tipoinsumo.class);
            entidad = (Tipoinsumo)query.getSingleResult();
        }catch(Exception e)
        {
            entidad = null;
        }
        
        return entidad;
    }
    
    public Medida getUnidadMedida(String idInsumo){
        String ejbQuery = "SELECT u.medida from Tipoinsumo u where u.idTipoInsumo = "+idInsumo;
        return em.createQuery(ejbQuery, Medida.class).getSingleResult();
        }
    
}
